//
//  ZQTopicViewController.m
//  BuDeJie
//
//  Created by 仲琦 on 16/4/20.
//  Copyright © 2016年 仲琦. All rights reserved.
//

#import "ZQTopicViewController.h"
#import <AFNetworking.h>
#import <MJExtension.h>
#import <SVProgressHUD.h>
#import "ZQTopicCell.h"
#import <SDImageCache.h>

@interface ZQTopicViewController ()


/** 所有的帖子数据(里面都是ZQTopic模型)*/
@property (nonatomic ,strong)NSMutableArray<ZQTopic *> *topicsArray;
/** 用来上拉加载数据的footer */
@property (nonatomic ,weak)UILabel *footer;
/** 用来刷新数据的header */
@property (nonatomic ,weak)UILabel *header;
/** 用来加载下一页数据的参数 */
@property (nonatomic ,copy)NSString *maxtime;
/** 是否正在加载更多数据... */
@property (nonatomic, assign, getter=isFooterRefreshing) BOOL footerRefreshing;
/** 是否正在加载新数据... */
@property (nonatomic, assign, getter=isHeaderRefreshing) BOOL headerRefreshing;

@property (nonatomic ,weak)AFHTTPSessionManager *manager;


@end

static NSString * const ZQTopicCellId = @"ZQTopicCellId";



@implementation ZQTopicViewController

- (ZQTopicType)type{return 0;}

- (AFHTTPSessionManager *)manager
{
    if (_manager == nil) {
        _manager = [AFHTTPSessionManager manager];
    }
    return _manager;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //设置tableView的内边距
    
    self.tableView.contentInset = UIEdgeInsetsMake(ZQNavBarMaxY + ZQTitleViewH, 0, ZQTabBarH, 0);
    //设置tableView右侧的滚动条位置
    self.tableView.scrollIndicatorInsets = self.tableView.contentInset;
    self.tableView.backgroundColor  = ZQGlobeColor;
    
    //设置取消系统分隔线
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    
    //预估高度
    
    //因为tableView有预估值,就不会提前调用模型来计算cell的实际高度,会使模型调用顺序发生变化
    
    //    self.tableView.estimatedRowHeight = 150;
    
    
    [self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass([ZQTopicCell class]) bundle:nil] forCellReuseIdentifier:ZQTopicCellId];
    
    
    [self setupRefresh];
    
    
    [self setupNote];
    
}

//创建子控件
- (void)setupRefresh
{
    //创建下拉刷新控件
    UILabel *header = [[UILabel alloc]init];
    header.text = @"下拉刷新数据";
    header.backgroundColor = [UIColor purpleColor];
    header.textAlignment = NSTextAlignmentCenter;
    header.zq_height = 50 ;
    header.zq_y = - header.zq_height;
    header.zq_width = self.tableView.zq_width;
    [self.tableView addSubview:header];
    self.header = header ;
    
    
    //创建广告界面
    UILabel *ADlabel = [[UILabel alloc]init];
    ADlabel.backgroundColor = [UIColor yellowColor];
    ADlabel.textAlignment = NSTextAlignmentCenter;
    ADlabel.text = @"广告广告广告广告";
    ADlabel.zq_height = 35;
    self.tableView.tableHeaderView = ADlabel;
    
    
    
    //创建下拉子控件
    UILabel *footer = [[UILabel alloc]init];
    footer.textAlignment = NSTextAlignmentCenter;
    footer.backgroundColor = [UIColor blueColor];
    footer.text = @"上拉加载数据";
    footer.zq_height = 35;
    
    self.tableView.tableFooterView = footer;
    self.footer = footer;
    
    //刷新
    [self HeaderBeginRefreshing];
    
}


#pragma  mark - 通知
//一定要解除通知
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

//接收通知方法
- (void)setupNote
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tabBarButtonDidRepeatClick) name: ZQTabBarButtonDidRepeatClickNotification object:nil];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(titleButtonDidRepeatClick) name:ZQTitleButtonDidRepeatClickNotification object:nil];
    
}

- (void)tabBarButtonDidRepeatClick
{
    //判断是否为当前界面
    if (self.tableView.scrollsToTop == NO) return;
    
    
    //判断是否为当前窗口
    if (self.tableView.window == nil) return;
    
    [self HeaderBeginRefreshing];
}

- (void)titleButtonDidRepeatClick
{
    [self tabBarButtonDidRepeatClick];
}

#pragma mark - 加载刷新数据

/**
 *  刷新数据
 */
- (void)loadNewTopics
{
    
    //停止当前任务  开始下段任务
    [self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
    
    //    //创建请求管理者
    //    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    //创建请求参数
    NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
    parameters[@"a"] = @"list";
    parameters[@"c"] = @"data";
    parameters[@"type"] = @(self.type);
    
    
    //发送请求任务
    [self.manager GET:ZQRequestURL parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        //存储加载的数据
        self.maxtime = responseObject[@"info"][@"maxtime"];
        
        //字典转模型
        self.topicsArray = [ZQTopic mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
        
        //刷新tableView
        [self.tableView reloadData];
        
        //返回正常状态
        [self HeaderEndRefreshing];
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        // 结束刷新(恢复刷新控件的状态)
        [self HeaderEndRefreshing];
        
        // 如果是因为取消任务来到failure这个block, 就直接返回, 不需要提醒错误信息
        if (error.code == NSURLErrorCancelled) return;
        
        // 请求失败的提醒
        [SVProgressHUD showErrorWithStatus:@"网络繁忙,请稍后再试!"];
        
        
        
    }];
}

/**
 *  加载更多的数据
 */
- (void)loadMoreTopics
{
    //    //创建请求管理者
    //    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    //停止当前任务,开始下段任务
    [self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
    
    //创建请求参数
    NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
    parameters[@"a"] = @"list";
    parameters[@"c"] = @"data";
    parameters[@"type"] = @(self.type);
    parameters[@"maxtime"] = self.maxtime;
    
    
    //发送请求任务
    [self.manager GET:ZQRequestURL parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        //存储加载的数据
        self.maxtime = responseObject[@"info"][@"maxtime"];
        
        //字典转模型
        NSArray *MoreTopics = [ZQTopic mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
        [self.topicsArray addObjectsFromArray:MoreTopics];
        
        //刷新数据
        [self.tableView reloadData];
        
        
        [self footerEndRefreshing];
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        // 结束刷新(恢复刷新控件的状态)
        [self footerEndRefreshing];
        
        // 如果是因为取消任务来到failure这个block, 就直接返回, 不需要提醒错误信息
        if (error.code == NSURLErrorCancelled) return;
        
        // 请求失败的提醒
        [SVProgressHUD showErrorWithStatus:@"网络繁忙,请稍后再试!"];
        
        
    }];
    
    
}


#pragma mark - scrollView代理

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    
    //判断是否正在刷新
    if (self.isHeaderRefreshing) return;
    
    
    CGFloat offsetY = - (self.tableView.contentInset.top + self.header.zq_height);
    // 当偏移量 <= offsetY时, 刷新header就完全出现
    if (self.tableView.contentOffset.y <= offsetY) {
        
        [self HeaderBeginRefreshing];
        
    };
    
    
    
}


//在scroll上拖动时调用
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    //处理footer
    [self dealFooter];
    //处理header
    [self dealHeader];
    
    //清除缓存
    [[SDImageCache sharedImageCache] clearMemory];
}


#pragma mark - 处理Header

- (void)dealHeader
{
    //判断header是否被创建 没有被创建就返回
    if (self.header == nil) return;
    //判断是否正在刷新
    if (self.isHeaderRefreshing) return;
    
    CGFloat offsetY = - (self.tableView.contentInset.top + self.header.zq_height);
    
    // 当偏移量 <= offsetY时, 刷新header就完全出现
    if (self.tableView.contentOffset.y <= offsetY) {//header完全出现
        
        self.header.text = @"松开立刻刷新数据";
        self.header.backgroundColor = [UIColor grayColor];
    }else{//header未完全出现
        
        self.header.text = @"下拉刷新数据";
        self.header.backgroundColor = [UIColor purpleColor];
    }
    
}
/**
 *  header开始刷新状态
 */
- (void)HeaderBeginRefreshing
{
    //判断是否正在刷新
    if (self.isHeaderRefreshing) return ;
    
    
    //修改刷新时的显示
    self.headerRefreshing = YES;
    self.header.text = @"正在刷新数据";
    self.header.backgroundColor = [UIColor blueColor];
    
    //刷新状态
    [UIView animateWithDuration:0.25 animations:^{
        
        UIEdgeInsets edge = self.tableView.contentInset;
        edge.top += self.header.zq_height;
        self.tableView.contentInset = edge;
        
        //设置偏移量是因为如果点击按钮刷新功能的话不设置偏移量会有bug
        CGPoint point = self.tableView.contentOffset;
        point.y = -edge.top;
        self.tableView.contentOffset = point;
    }];
    
    //刷新数据
    
    [self loadNewTopics];
    
    
}
/**
 *  header结束刷新状态
 */
- (void)HeaderEndRefreshing
{
    //结束刷新
    self.headerRefreshing = NO;
    
    
    //返回正常状态
    [UIView animateWithDuration:0.25 animations:^{
        UIEdgeInsets edge = self.tableView.contentInset;
        edge.top -= self.header.zq_height;
        self.tableView.contentInset = edge;
        
    }];
    
}


#pragma mark - 处理footer

- (void)dealFooter
{
    //如果数据等于0 直接返回
    if (self.topicsArray.count == 0) return;
    
    //如果正在刷新, 直接返回
    if (self.isFooterRefreshing) return;
    
    CGFloat offsetY = self.tableView.contentSize.height + self.tableView.contentInset.bottom - self.tableView.zq_height;
    
    //判断 偏移量 >= offsetY footer完全出现,进入上拉刷新数据状态
    if (self.tableView.contentOffset.y >= offsetY) {
        
        [self footerBeginRefreshing];
        
    };
    
    
}
/**
 *  footer开始刷新状态
 */
- (void)footerBeginRefreshing
{
    //进入刷新状态
    self.footerRefreshing = YES;
    
    self.footer.text = @" 正在加载数据";
    
    self.footer.backgroundColor = [UIColor redColor];
    
    //发送请求给服务器 加载更多数据`
    [self loadMoreTopics];
    
    
}
/**
 *  footer结束刷新状态
 */
- (void)footerEndRefreshing
{
    //返回正常状态
    self.footerRefreshing = NO;
    self.footer.backgroundColor = [UIColor blueColor];
    self.footer.text = @"上拉加载数据";
    
}



#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
    //没有数据显示就隐藏footer
    self.footer.hidden = (self.topicsArray.count == 0);
    
    return self.topicsArray.count;
}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    ZQTopicCell *cell = [tableView dequeueReusableCellWithIdentifier:ZQTopicCellId];
    
    cell.topic = self.topicsArray[indexPath.row];
    //    if (cell ==nil) {
    //        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ZQTopicCellId];
    //    }
    //    ZQTopic *topic = self.topicsArray[indexPath.row];
    //    cell.textLabel.text = topic.name;
    //    cell.detailTextLabel.text = topic.passtime;
    
    
    
    
    return cell;
}

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //数组中没有模型中的高度属性
    //可以给数组设置泛型.
    return self.topicsArray[indexPath.row].cellHeight;
    
    
}






@end
